package jdk8;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class RepeatingAnnotations {

	@Params({ @Param("a"), @Param("b") })
	public void test1() {
	}

	// 测试重复注解
	@Param("a")
	@Param("b")
	public void test2() {
	}

	// ElementType.TYPE_PARAMETER 可以用在泛型
	public <@Value T> void test3(String s) {
	}
}

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface Use {
	// 所有使用到类型的地方都可以使用
}

@Target(ElementType.TYPE_PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface Value {

}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
/**
 * JAVA8中还增加了一个特性RepeatingAnnotation，允许为同一个声明式或者类型加上相同的 Annotation
 * 
 * @Repeatable 标签后括号中的值即为指定的 Container Annotation 的类型。在这个例子中，Container Annotation 
 * 的类型是 Params，Java 编译器会把重复的 Param 对象保存在 Params中。Params中必须定义返回数组类型的value()方法。
 * 数组中元素的类型必须为对应的 Repeating Annotation 类型
 */
@Repeatable(value = Params.class)
@interface Param {
	String value() default "";
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@interface Params {
	Param[] value();
}